<?php
// 应用公共文件

// 定义状态码常量
define('SUCCESS', 0);
define('FAIL', 20000);
define('UNAUTHORIZED', 401);
define('FORBIDDEN', 403);
define('NOT_FOUND', 404);
define('SERVER_ERROR', 500);

// JWT配置
define('JWT_KEY', 'auxface_jwt_secret_key'); // JWT密钥
define('JWT_ISS', 'auxface'); // 签发者
define('JWT_AUD', 'api_user'); // 接收者
define('JWT_EXPIRE', 7200); // 过期时间(秒)


/**
 * [result 返回值]
 * @param  [type] $code    [返回代码]
 * @param  string $data    [返回数据]
 * @param  [type] $message [返回信息]
 * @return [type]          [description]
 */
function result($code=0,$message='',$data=''){
    return json(['code'=>$code,'data'=>$data,'msg'=>$message]);
}
/**
 * [geturl get方法的curl]
 * @param  [string] $url [需要请求的地址]
 * @return [array]      [返回的数据]
 */
function getCurl($url)
{
    if (empty($url)) {
        return false;
    }

    $headerArray = array("Content-Type:application/json;", "Accept:application/json");
    $ch          = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headerArray);
    $output = curl_exec($ch);
    // dd($output);
    curl_close($ch);
    $output = json_decode($output, true);
    return $output;
}

/**
 * [geturl post方法的curl]
 * @param  [type] $url [需要请求的地址]
 * @param  [data] $param [请求的数据]
 * @return [type]      [array]
 */
function postCurl($url, $param, $decode = true)
{
    if (empty($url) || empty($param)) {
        return false;
    }
    $postUrl  = $url;
    $curlPost = $param;
    // 初始化curl
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $postUrl);
    curl_setopt($curl, CURLOPT_HEADER, 0);
    // 要求结果为字符串且输出到屏幕上
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    // post提交方式
    curl_setopt($curl, CURLOPT_POST, 1);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $curlPost);
    // 运行curl
    $data = curl_exec($curl);
    curl_close($curl);
    if ($decode) {
        return json_decode($data, true);
    }

    return $data;
}

/**
 * @Descripttion: 设置全库唯一码
 * @Author: Terry
 * @Date: 2021-10-04 19:12:15
 * @param {*}
 */
function createUuid(){
    $uuid = uuid_create(1);
    $uuid = str_replace('-','',$uuid);
    return strtoupper($uuid);
}

/**
 * 生成订单号
 * @return string
 */
function generateOrderNo()
{
    return 'UED'.date('YmdHis') . substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);
}

/**
 * 生成JWT Token
 * @param int $userId 用户ID
 * @param array $customData 自定义数据
 * @return string JWT token
 * @throws Exception
 */
function generateToken($userId, $customData = [])
{
    if (!class_exists('Firebase\JWT\JWT')) {
        throw new \Exception('请安装JWT包: composer require firebase/php-jwt');
    }
    
    $time = time();
    $payload = [
        'iss' => JWT_ISS, // 签发者
        'aud' => JWT_AUD, // 接收者
        'iat' => $time, // 签发时间
        'nbf' => $time, // 生效时间
        'exp' => $time + JWT_EXPIRE, // 过期时间
        'uid' => $userId, // 用户ID
        'data' => $customData // 自定义数据
    ];
    
    return \Firebase\JWT\JWT::encode($payload, JWT_KEY, 'HS256');
}

/**
 * 验证JWT Token
 * @param string $token JWT token
 * @return object|false 成功返回payload对象，失败返回false
 */
function verifyToken($token)
{
    if (!class_exists('Firebase\JWT\JWT')) {
        return false;
    }
    
    try {
        // 设置JWT解码的算法白名单
        \Firebase\JWT\JWT::$leeway = 60; // 设置时间偏差为60秒
        $key = new \Firebase\JWT\Key(JWT_KEY, 'HS256');
        $decoded = \Firebase\JWT\JWT::decode($token, $key);
        
        // 检查签发者和接收者
        if ($decoded->iss !== JWT_ISS || $decoded->aud !== JWT_AUD) {
            return false;
        }
        
        return $decoded;
    } catch (\Exception $e) {
        return false;
    }
}
